Main Text Figures
comb_epr_plot = comb_preds %>%
filter(metric == "EPR") %>%
ggplot() +
geom_point(aes(temp, rate, colour = curve_id), filter(comb_d, metric == "EPR"), size = 1.5, alpha = 0.6,
position = position_jitter(width = 0.5, height = 0)) +
geom_ribbon(aes(temp, ymin = conf_lower, ymax = conf_upper, group = curve_id), filter(comb_boot_conf_preds, metric == "EPR"), fill = 'grey60', alpha = 0.3) +
geom_line(aes(temp, .fitted, col = curve_id), size = 2) +
#scale_color_brewer(type = "div", palette = 5, direction = -1) +
#scale_color_viridis_d(option = "mako") +
scale_colour_manual(values = comb_colors) +
labs(x = "Temperature (degrees C)",
y = "Egg Production Rate \n(eggs/female/day)",
colour = "Month") +
theme_matt(base_size = 12)
comb_hs_plot = comb_preds %>%
filter(metric == "HF") %>%
ggplot() +
geom_point(aes(temp, rate, colour = curve_id), filter(comb_d, metric == "HF"), size = 1.5, alpha = 0.6,
position = position_jitter(width = 0.5, height = 0)) +
geom_ribbon(aes(temp, ymin = conf_lower, ymax = conf_upper, group = curve_id), filter(comb_boot_conf_preds, metric == "HF"), fill = 'grey60', alpha = 0.3) +
geom_line(aes(temp, .fitted, col = curve_id), size = 2) +
#scale_color_brewer(type = "div", palette = 5, direction = -1) +
#scale_color_viridis_d(option = "mako") +
scale_colour_manual(values = comb_colors) +
labs(x = "Temperature (degrees C)",
y = "Hatching Success \n(%)",
colour = "Month") +
theme_matt(base_size = 12)
comb_rf_plot = comb_preds %>%
filter(metric == "RF") %>%
ggplot() +
geom_point(aes(temp, rate, colour = curve_id), filter(comb_d, metric == "RF"), size = 1.5, alpha = 0.6,
position = position_jitter(width = 0.5, height = 0)) +
geom_ribbon(aes(temp, ymin = conf_lower, ymax = conf_upper, group = curve_id), filter(comb_boot_conf_preds, metric == "RF"), fill = 'grey60', alpha = 0.3) +
geom_line(aes(temp, .fitted, col = curve_id), size = 2) +
#scale_color_brewer(type = "div", palette = 5, direction = -1) +
#scale_color_viridis_d(option = "mako") +
scale_colour_manual(values = comb_colors) +
labs(x = "Temperature (degrees C)",
y = "Production \n(offspring/female/day)",
colour = "Month") +
theme_matt(base_size = 12)
comb_tsc = ggplot(comb_surv, aes(x=Temp, y=Surv, colour=Month)) +
geom_point(size=1.5, position=position_jitter(width=0.1, height=0.03)) +
xlab("Stress Temperature")+
ylab("Survivorship \n(proportion survived)")+
labs(colour = "Month") +
geom_hline(yintercept = 0.5, linetype = "dashed") +
geom_smooth(method = "glm", method.args = list(family = "binomial"), se=T, size = 2) +
scale_y_continuous(breaks = c(0,1)) +
#scale_color_brewer(type = "div", palette = 5, direction = -1) +
#scale_color_viridis_d(option = "mako") +
scale_colour_manual(values = comb_colors) +
theme_matt(base_size = 12)
ggarrange(comb_epr_plot, a, comb_hs_plot, comb_rf_plot, a, comb_tsc,
ncol = 3, nrow = 2, widths = c(1,.1,1),
common.legend = T, legend = "bottom")

combined_opt_coll = comb_params %>%
filter(metric == "RF" & term == "topt") %>%
ggplot(aes(x = growth_temp, y = estimate, shape = species)) +
geom_smooth(data = filter(comb_params, metric == "RF" & term == "topt" & curve_id != "November_2"),
method = "lm", colour = "grey50") +
geom_point(size = 3, stroke = 1) +
scale_shape_manual(values = c(16,21)) +
ylab("Optimum (degrees C)") +
xlab("Collection Temperature (degrees c)") +
labs(colour = "Month") +
theme_matt(base_size = 12)
combined_opt_diff = comb_params %>%
filter(metric == "RF" & term == "topt") %>%
ggplot(aes(x = growth_temp, y = margin, shape = species)) +
geom_hline(yintercept = 0, size =1, linetype = "dashed") +
geom_smooth(data = filter(comb_params, metric == "RF" & term == "topt" & curve_id != "November_2"),
method = "lm", colour = "grey50") +
geom_point(size = 3, stroke = 1) +
ylab("Margin (degrees C)") +
xlab("Collection Temperature (degrees c)") +
scale_shape_manual(values = c(16,21)) +
theme_matt(base_size = 12)
combined_ld_coll = ggplot(combined_tolerance, aes(x = Coll_temp, y = LD50, shape = species)) +
geom_smooth(method = "lm", colour = "grey50") +
geom_point(size = 3, stroke = 1) +
scale_shape_manual(values = c(16,21)) +
ylab("Thermal Tolerance (degrees C)") +
xlab("Collection Temperature (degrees c)") +
theme_matt(base_size = 12)
combined_ld_diff = ggplot(combined_tolerance, aes(x = Coll_temp, y = margin, shape = species)) +
geom_smooth(method = "lm", colour = "grey50") +
geom_point(size = 3, stroke = 1) +
scale_shape_manual(values = c(16,21)) +
ylab("Warming Tolerance (degrees C)") +
xlab("Collection Temperature (degrees c)") +
theme_matt(base_size = 12)
ggarrange(combined_opt_coll, combined_opt_diff, combined_ld_coll, combined_ld_diff, ncol = 2, nrow = 2, common.legend = T, legend = "bottom")

F0_rf_summary$month = factor(F0_rf_summary$month, levels = c("June", "August", "November"))
F0_rf_summary$duration = factor(F0_rf_summary$duration, levels = c("short", "long"))
F0_dur_summary$month = factor(F0_dur_summary$month, levels = c("June", "August", "November"))
param_list = list()
param_list[["colour"]] = "black"
param_list[["width"]] = 0.2
RF_short_db = plot(F0_RF_short,
axes.title.fontsize = 10,
tick.fontsize = 10,
effsize.markersize = 3,
swarmplot.params = param_list,
rawplot.ylabel = "Production",
theme = ggpubr::theme_pubr())
RF_long_db = plot(F0_RF_long,
axes.title.fontsize = 10,
tick.fontsize = 10,
effsize.markersize = 3,
swarmplot.params = param_list,
rawplot.ylabel = "Production",
theme = ggpubr::theme_pubr())
b1 = ggplot() + theme_pubclean() + ggtitle(" Short Heat Waves")
b2 = ggplot() + theme_pubclean() + ggtitle(" Long Heat Waves")
F0_fecundity_plot = ggarrange(b1, RF_short_db, b2, RF_long_db, ncol = 1, nrow = 4, heights = c(0.1, 1, 0.1, 1))
x.axis_labels = c("1" = "short", "2" = "long", "3" = "short", "4" = "long")
F0_grid = F0_rf_summary %>%
mutate(month = fct_relevel(month, "June", "August", "November")) %>%
ggplot(aes(x = duration, y = difference, colour = trait, shape = duration)) +
facet_grid(. ~ month) +
geom_hline(yintercept = 0, colour = "black", size = 0.3) +
geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, size = 1.3) +
geom_point(size = 5, fill = "white") +
scale_colour_manual(values = c("body size" = "grey80", "production" = "black")) +
scale_shape_manual(values = c("long" = 16, "short" = 21)) +
scale_x_discrete(labels= x.axis_labels) +
ggtitle("Direct Effects (F0)") +
xlab("") +
ylab("Effect Size\nHeatwave - Control") +
ylim(-1,1.1) +
theme_bw(base_size = 12) +
theme(panel.grid = element_blank(),
axis.text = element_text(colour = "black"),
axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5),
legend.position = "none")
F1_summary = bind_rows(F1_rf_effect_size, F1_bs_effect_size) %>%
dplyr::select(variable, difference, bca_ci_low, bca_ci_high, month, duration, trait, generation, off_temp) %>%
mutate("order_code" = paste(trait, duration, sep = "_"),
"order_number" = case_when(
order_code == "production_short" ~ 1,
order_code == "production_long" ~ 2,
order_code == "body size_short" ~ 3,
order_code == "body size_long" ~ 4),
month = fct_relevel(month, "June", "August", "November"))
F1_summary$order_number = factor(F1_summary$order_number, levels = c(1,2,3,4))
F1_grid = ggplot(F1_summary, aes(x = order_number, y = difference, colour = trait, shape = duration, group = trait)) +
facet_grid(off_temp ~ month, ) +
geom_hline(yintercept = 0, colour = "black", size = 0.3) +
geom_line() +
geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, size = 1) +
geom_point(size = 3, fill = "white") +
scale_colour_manual(values = c("body size" = "grey75", "production" = "black")) +
scale_shape_manual(values = c("long" = 16, "short" = 21)) +
xlim(0.5,4.5) +
scale_x_discrete(labels= x.axis_labels) +
xlab("") +
ylab("Effect Size\nHeatwave - Control") +
ggtitle("Transgenerational Effects (F1)") +
theme_bw(base_size = 12) +
theme(panel.grid = element_blank(),
strip.background.x = element_blank(),
strip.text.x = element_blank(),
axis.text = element_text(colour = "black"),
axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5))
ggarrange(F0_grid, F1_grid, nrow = 2, ncol = 1, heights = c(0.45,1), common.legend = T, legend = "right")

Supplemental Information
#field tpc parameters
comb_params %>%
mutate(curve_id = fct_relevel(curve_id, c("January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November_1", "November_2"))) %>%
ggplot(aes(x = curve_id, y = estimate, colour = species)) +
facet_wrap(term~metric, scales = 'free_y') +
geom_point(size = 4) +
geom_linerange(aes(ymin = conf_lower, ymax = conf_upper)) +
scale_colour_manual(values = c("royalblue1", "indianred2")) +
labs(x = "Month",
y = "Parameter Estimate",
colour = "Species") +
theme_bw(base_size = 16) +
theme(panel.grid = element_blank(),
axis.text.x = element_text(angle = 315, hjust = 0, vjust = 0.5))

#field tpc parameters
ggplot(comb_params, aes(x = growth_temp, y = estimate, colour = species)) +
facet_wrap(term~metric, scales = 'free_y') +
geom_smooth(data = filter(comb_params, curve_id != "November_2"),
method = "lm", se = F) +
geom_point(size = 4) +
geom_linerange(aes(ymin = conf_lower, ymax = conf_upper)) +
scale_colour_manual(values = c("royalblue1", "indianred2")) +
labs(x = "Collection Temperature (degrees C)",
y = "Parameter Estimate",
colour = "Species") +
theme_bw(base_size = 12) +
theme(panel.grid = element_blank())

comb_params %>%
filter(term == "topt") %>%
ggplot(aes(x = growth_temp, y = margin, colour = species, group = species)) +
facet_grid(metric~., scales = 'free_y') +
geom_hline(yintercept = 0) +
geom_smooth(data = filter(comb_params, term == "topt" & curve_id != "November_2"),
method = "lm", se = F, size = 2) +
geom_point(size = 4) +
scale_colour_manual(values = c("royalblue1", "indianred2")) +
labs(x = "Collection Temperature",
y = "Safety Margin") +
theme_bw(base_size = 18) +
theme(panel.grid = element_blank())

#Subsequent Rows
F1_hs_effect_size$trait = "success"
F1_hs_effect_size$generation = "F1"
F1_total_effect_size$trait = "epr"
F1_total_effect_size$generation = "F1"
F1_rf_effect_size$trait = "production"
F1_rf_effect_size$generation = "F1"
F1_bs_effect_size$trait = "size"
F1_bs_effect_size$generation = "F1"
F0_data = bind_rows(F0_hs_summary, F0_total_summary,F0_rf_summary, F0_size_summary) %>%
dplyr::select(trait, difference, bca_ci_low, bca_ci_high, month, duration, trait, generation) %>%
mutate("order_code" = paste(trait, duration, sep = "_"),
"order_number" = case_when(
order_code == "total_short" ~ 1,
order_code == "total_long" ~ 2,
order_code == "success_short" ~ 3,
order_code == "success_long" ~ 4,
order_code == "production_short" ~ 5,
order_code == "production_long" ~ 6,
order_code == "size_long" ~ 7),
month = fct_relevel(month, "June", "August", "November"),
trait = fct_relevel(trait, "total", "success", "production", "size"),
duration = fct_relevel(duration, "short", "long"))
F0_data$order_number = factor(F0_data$order_number, levels = c(1,2,3,4,5,6,7))
F1_data = bind_rows(F1_total_effect_size, F1_hs_effect_size, F1_rf_effect_size, F1_bs_effect_size) %>%
dplyr::select(trait, difference, bca_ci_low, bca_ci_high, month, duration, generation, off_temp) %>%
mutate("order_code" = paste(trait, duration, sep = "_"),
"order_number" = case_when(
order_code == "epr_short" ~ 1,
order_code == "epr_long" ~ 2,
order_code == "success_short" ~ 3,
order_code == "success_long" ~ 4,
order_code == "production_short" ~ 5,
order_code == "production_long" ~ 6,
order_code == "size_short" ~ 7,
order_code == "size_long" ~ 8),
trait = if_else(trait == "epr", "total", trait),
month = fct_relevel(month, "June", "August", "November"),
trait = fct_relevel(trait, "total", "success", "production", "size"),
duration = fct_relevel(duration, "short", "long"))
F1_data$order_number = factor(F1_data$order_number, levels = c(1,2,3,4,5,6,7,8))
#Top row - F0 (direct effects)
x.axis_labels = c("1" = "short", "2" = "long", "3" = "short", "4" = "long", "5" = "short", "6" = "long", "7" = "short", "8" = "long")
F0_grid = ggplot(F0_data, aes(x = duration, y = difference, colour = trait, shape = duration)) +
facet_grid(. ~ month) +
geom_hline(yintercept = 0, colour = "black", size = 0.3) +
geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, size = 1,
position = position_dodge(width = 0.7)) +
geom_point(size = 4, fill = "white", position = position_dodge(width = 0.7)) +
scale_shape_manual(values = c("long" = 16, "short" = 21)) +
scale_x_discrete(labels= x.axis_labels) +
scale_colour_manual(values = c("size" = "darkgrey",
"success" = "gold",
"production" = "forestgreen",
"total" = "cornflowerblue")) +
xlab("") +
ylab("Effect Size\nHeatwave - Control") +
theme_bw(base_size = 12) +
theme(panel.grid = element_blank(),
axis.text = element_text(colour = "black"),
axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5),
legend.position = "none")
#Following three rows - F1 (transgeneration / indirect effects)
F1_grid = ggplot(F1_data, aes(x = duration, y = difference, colour = trait, shape = duration, group = trait)) +
facet_grid(off_temp ~ month, ) +
geom_hline(yintercept = 0, colour = "black", size = 0.3) +
geom_line(position = position_dodge(width = 0.5)) +
geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, size = 1,
position = position_dodge(width = 0.5)) +
geom_point(size = 3, fill = "white", position = position_dodge(width = 0.5)) +
scale_shape_manual(values = c("long" = 16, "short" = 21)) +
xlim(0.5,4.5) +
scale_x_discrete(labels= x.axis_labels) +
scale_colour_manual(values = c("size" = "darkgrey",
"success" = "gold",
"production" = "forestgreen",
"total" = "cornflowerblue")) +
xlab("") +
ylab("Effect Size") +
theme_bw(base_size = 12) +
theme(panel.grid = element_blank(),
strip.background.x = element_blank(),
strip.text.x = element_blank(),
axis.text = element_text(colour = "black"),
axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5))
ggarrange(F0_grid, F1_grid, nrow = 2, ncol = 1, heights = c(0.35,1), common.legend = T, legend = "right")

F0_fecundity_plot

#Effect of heatwave duration WITHIN treatment
F0_dur_summary %>%
mutate(month = fct_relevel(month, c("June", "August", "November"))) %>%
ggplot(aes(x = month, fill = treatment, y = difference)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.9), colour = "black", size = 1) +
geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high),
width = 0.1, size = 1,
position = position_dodge(width = 0.9)) +
geom_hline(yintercept = 0) +
scale_fill_manual(values = c("grey30", "white")) +
labs(x = "",
y = "Effect Size (Hedge's g) \n Long - Short events") +
theme_pubr(base_size = 18)

# How does heat wave duration affect transgenerational effects? Reaction norms shown below for effect size comparisons (heatwave - control) for different duration of parental exposure
F1_data %>%
dplyr::select(month, duration, off_temp, trait, difference, bca_ci_low, bca_ci_high) %>%
mutate("ID" = paste(month, off_temp, trait, sep = "_"),
month = fct_relevel(month, c("June", "August", "November")),
duration = fct_relevel(duration, c("short", "long"))) %>%
ggplot(aes(x = duration, y = difference, colour = month, group = ID)) +
facet_wrap(trait~.) +
geom_hline(yintercept = 0) +
geom_line(size = 1, position = position_dodge(width = 0.1)) +
geom_point(size = 2, position = position_dodge(width = 0.1)) +
geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high),
size = 0.75, width = 0.1,
position = position_dodge(width = 0.1)) +
labs(x = "Parental Exposure Duration",
y = "Effect Size (Hedge's g) \n Heatwave - Control") +
ylim(-5,5) +
theme_pubr(base_size = 18)

duration_effects = F1_data %>%
dplyr::select(month, duration, off_temp, trait, difference, bca_ci_low, bca_ci_high) %>%
mutate("ID" = paste(month, off_temp, trait, sep = "_"),
month = fct_relevel(month, c("June", "August", "November")),
duration = fct_relevel(duration, c("short", "long"))) %>%
group_by(ID, trait, duration) %>%
mutate("zero_diff" = case_when(
sign(bca_ci_low) == sign(bca_ci_high) ~ "does not overlap zero",
sign(bca_ci_low) != sign(bca_ci_high) ~ "overlaps zero"
)) %>%
ungroup(duration) %>%
mutate("change" = case_when(
sign(difference)[1] == sign(difference)[2] & zero_diff[1] == zero_diff[2] ~ "Same",
sign(difference)[1] != sign(difference)[2] & zero_diff[1] == "overlaps zero" & zero_diff[2] == "overlaps zero" ~ "Same",
sign(difference)[1] != sign(difference)[2] & zero_diff[1] == zero_diff[2] & zero_diff[1] == "does not overlap zero" ~ "Different",
sign(difference)[1] != sign(difference)[2] & zero_diff[1] != zero_diff[2] ~ "Different",
sign(difference)[1] == sign(difference)[2] & zero_diff[1] != zero_diff[2] ~ "Different"
)) %>%
arrange(month, off_temp, trait) %>%
filter(change == "Different")
select_rnorms = duration_effects %>%
dplyr::select(-duration, -difference, -bca_ci_low, -bca_ci_high, -ID, -zero_diff) %>%
distinct()
sig_changes = F1_data %>%
dplyr::select(month, duration, off_temp, trait, difference, bca_ci_low, bca_ci_high) %>%
mutate("ID" = paste(month, off_temp, trait, sep = "_"),
month = fct_relevel(month, c("June", "August", "November")),
duration = fct_relevel(duration, c("short", "long"))) %>%
filter(ID %in% select_rnorms$ID)
ggplot(sig_changes, aes(x = duration, y = difference, colour = month, group = ID)) +
facet_wrap(trait~.) +
geom_hline(yintercept = 0) +
geom_line(size = 1, position = position_dodge(width = 0.1)) +
geom_point(size = 2, position = position_dodge(width = 0.1)) +
geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high),
size = 0.75, width = 0.1,
position = position_dodge(width = 0.1)) +
geom_label_repel(data = sig_changes %>% filter(duration == "long"),
aes(label = off_temp,
x = duration,
y = difference,
color = month),
box.padding = 0.5,
nudge_x = 0.2,
size = 7,
show.legend=FALSE) +
labs(x = "Parental Exposure Duration",
y = "Effect Size (Hedge's g)\nHeatwave - Control") +
ylim(-5,5) +
theme_pubr(base_size = 18)

rdata = file_list[str_detect(file_list, pattern = ".RData")]
f1_data = rdata[str_detect(rdata, pattern = "F0_", negate = T)] %>%
str_split_fixed(pattern = ".RData", n = 2)
f1_data = f1_data[,1]
plot_names = c()
for(i in 1:length(f1_data)){
plot_name = paste(f1_data[i], "_plot", sep = "")
plot_names = c(plot_names, plot_name)
metric = str_split_fixed(plot_name, pattern = "_", n = 4)[,2]
if(metric == "total"){
label = "Egg Production (per female)"
}
if(metric == "rf"){
label = "Production (per female)"
}
if(metric == "hs"){
label = "Hatching Success (%)"
}
if(metric == "bs"){
label = "Body Size (mm)"
}
assign(plot_name,
plot(get(f1_data[i]),
effsize.markersize = 2,
axes.title.fontsize = 9,
tick.fontsize = 6,
swarmplot.params = param_list,
rawplot.ylabel = label,
theme = ggpubr::theme_pubr()))
}
bs_plots = plot_names[str_detect(plot_names, pattern = "_bs_")]
rf_plots = plot_names[str_detect(plot_names, pattern = "_rf_")]
total_plots = plot_names[str_detect(plot_names, pattern = "_total_")]
hs_plots = plot_names[str_detect(plot_names, pattern = "_hs_")]
ggarrange(June_bs_short_plot, June_bs_long_plot,
August_bs_short_plot, August_bs_long_plot,
November_bs_short_plot, November_bs_long_plot,
ncol = 2, nrow = 3,
labels = "AUTO",
vjust = -0.2)

ggarrange(June_total_short_plot, June_total_long_plot,
August_total_short_plot, August_total_long_plot,
November_total_short_plot, November_total_long_plot,
ncol = 2, nrow = 3,
labels = "AUTO",
vjust = -0.2)

ggarrange(June_hs_short_plot, June_hs_long_plot,
August_hs_short_plot, August_hs_long_plot,
November_hs_short_plot, November_hs_long_plot,
ncol = 2, nrow = 3,
labels = "AUTO",
vjust = -0.2)

ggarrange(June_rf_short_plot, June_rf_long_plot,
August_rf_short_plot, August_rf_long_plot,
November_rf_short_plot, November_rf_long_plot,
ncol = 2, nrow = 3,
labels = "AUTO",
vjust = -0.2)

seasonal_cols = c("June" = "#E69F00", "August" = "#D55E00", "November" = "#0072B2")
F1_fbs$ID = paste(F1_fbs$Month, F1_fbs$Parental_treatment, F1_fbs$Day, sep = "_")
ggplot(F1_fbs, aes(x = Offspring_temp, y = Size, colour = Month, group = ID, linetype = Parental_treatment)) +
geom_jitter(width = 0.5, size = 1.6, alpha = 0.4) +
geom_smooth(method = "lm", size = 1.4, alpha = 0.2) +
theme_pubr() + theme(legend.position = "right") +
scale_x_continuous(breaks = c(12,17,22)) +
scale_colour_manual(values = seasonal_cols)

LS0tCnRpdGxlOiAiRmlndXJlcyBmb3IgU2Vhc29uYWxseSB2YXJpYWJsZSB0aGVybWFsIHBlcmZvcm1hbmNlIGN1cnZlcyBwcmV2ZW50IGFkdmVyc2UgZWZmZWN0cyBvZiBoZWF0d2F2ZXMiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgICAgICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgICAgICAgdG9jOiB0cnVlCiAgICAgICAgICB0b2NfZmxvYXQ6IHRydWUKICBnaXRodWJfZG9jdW1lbnQ6CiAgICAgICAgICB0b2M6IHRydWUKICAgICAgICAgIHRvY19kZXB0aDogMgogICAgICAgICAgaHRtbF9wcmV2aWV3OiBmYWxzZQplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgZmlnLmFsaWduPSJjZW50ZXIiLCBtZXNzYWdlID0gRiwgd2FybmluZyA9IEZ9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlY2hvID0ga25pdHI6OmlzX2h0bWxfb3V0cHV0KCksCiAgZmlnLmFsaWduID0gImxlZnQiLAogIGZpZy5wYXRoID0gIi4uL0ZpZ3VyZXMvbWFya2Rvd24vIiwKICBtZXNzYWdlID0gRkFMU0UsCiAgd2FybmluZyA9IEZBTFNFLAogIGNvbGxhcHNlID0gVCwKICBkZXYgPSBjKCJwbmciLCAicGRmIikKKQoKc3QuZXJyIDwtIGZ1bmN0aW9uKHgsIG5hLnJtPUZBTFNFKSB7CiAgaWYobmEucm09PVRSVUUpIHggPC0gbmEub21pdCh4KQogIHNkKHgpL3NxcnQobGVuZ3RoKHgpKQp9Cgp0aGVtZV9tYXR0ID0gZnVuY3Rpb24oYmFzZV9zaXplKXsKICBnZ3B1YnI6OnRoZW1lX3B1YnIoYmFzZV9mYW1pbHk9InNhbnMiKSAlK3JlcGxhY2UlIAogICAgdGhlbWUoCiAgICAgIHBhbmVsLmJhY2tncm91bmQgID0gZWxlbWVudF9ibGFuaygpLAogICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLCAKICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLAogICAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwKICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT1iYXNlX3NpemUgKiAwLjgpLAogICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSAqIDAuOCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gImJvbGQiKSwKICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUpLAogICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUgKiAxLjIpLAogICAgICB0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS41NSkKICAgICkKfQoKaDFfZXByJE1vbnRoID0gZmFjdG9yKGgxX2VwciRNb250aCwgbGV2ZWxzID0gYygiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9jdG9iZXIiLCAiTm92ZW1iZXJfMSIsICJOb3ZlbWJlcl8yIikpCgpodWRzX2gxX2VwciRNb250aCA9IGZhY3RvcihodWRzX2gxX2VwciRNb250aCwgbGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIpKQoKdG9uc2FfY29sb3JzID0gYygiSnVseSIgPSAiIzc5MTEwMSIsICJBdWd1c3QiID0gIiNBRDIxMDYiLCAiU2VwdGVtYmVyIiA9ICIjQ0MzNDAzIiwgCiAgICAgICAgICAgICAgICAgIk9jdG9iZXIiID0gIiNFRjVGMDgiLCAiTm92ZW1iZXJfMSIgPSAiI0YyNzAwNiIsICJOb3ZlbWJlcl8yIiA9ICIjRUVCNjBBIikKCmh1ZHNfY29sb3JzID0gYygiSmFudWFyeSIgPSAiIzA2MUIyNCIsICJGZWJydWFyeSIgPSAiIzBGNDI1NiIsICJNYXJjaCIgPSAiIzE1NkQ4RCIsIAogICAgICAgICAgICAgICAgIkFwcmlsIiA9ICIjMkZBQURDIiwgIk1heSIgPSAiIzYxQkZFMyIsICJKdW5lIiA9ICIjOTdENUVFIikKCmNvbWJfY29sb3JzID0gYyhodWRzX2NvbG9ycywgdG9uc2FfY29sb3JzKQoKYSA9IGdncGxvdCgpICsgdGhlbWVfcHViY2xlYW4oKQoKc3VydiRNb250aCA9IGZhY3RvcihzdXJ2JE1vbnRoLCBsZXZlbHMgPSBjKCJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkKaHVkc19zdXJ2JE1vbnRoID0gZmFjdG9yKGh1ZHNfc3VydiRNb250aCwgbGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIpKQpgYGAKCiMjIE1haW4gVGV4dCBGaWd1cmVzCmBgYHtyIGZpZ3VyZS0yLWNvbWJpbmVkLXRwY3MsIGZpZy5oZWlnaHQ9Nn0KY29tYl9lcHJfcGxvdCA9IGNvbWJfcHJlZHMgJT4lIAogIGZpbHRlcihtZXRyaWMgPT0gIkVQUiIpICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9wb2ludChhZXModGVtcCwgcmF0ZSwgY29sb3VyID0gY3VydmVfaWQpLCBmaWx0ZXIoY29tYl9kLCBtZXRyaWMgPT0gIkVQUiIpLCBzaXplID0gMS41LCBhbHBoYSA9IDAuNiwgCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuNSwgaGVpZ2h0ID0gMCkpICsKICBnZW9tX3JpYmJvbihhZXModGVtcCwgeW1pbiA9IGNvbmZfbG93ZXIsIHltYXggPSBjb25mX3VwcGVyLCBncm91cCA9IGN1cnZlX2lkKSwgZmlsdGVyKGNvbWJfYm9vdF9jb25mX3ByZWRzLCBtZXRyaWMgPT0gIkVQUiIpLCBmaWxsID0gJ2dyZXk2MCcsIGFscGhhID0gMC4zKSArCiAgZ2VvbV9saW5lKGFlcyh0ZW1wLCAuZml0dGVkLCBjb2wgPSBjdXJ2ZV9pZCksIHNpemUgPSAyKSArCiAgI3NjYWxlX2NvbG9yX2JyZXdlcih0eXBlID0gImRpdiIsIHBhbGV0dGUgPSA1LCBkaXJlY3Rpb24gPSAtMSkgKyAKICAjc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWtvIikgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGNvbWJfY29sb3JzKSArIAogIGxhYnMoeCA9ICJUZW1wZXJhdHVyZSAoZGVncmVlcyBDKSIsIAogICAgICAgeSA9ICJFZ2cgUHJvZHVjdGlvbiBSYXRlIFxuKGVnZ3MvZmVtYWxlL2RheSkiLAogICAgICAgY29sb3VyID0gIk1vbnRoIikgKyAKICB0aGVtZV9tYXR0KGJhc2Vfc2l6ZSA9IDEyKQoKY29tYl9oc19wbG90ID0gY29tYl9wcmVkcyAlPiUgCiAgZmlsdGVyKG1ldHJpYyA9PSAiSEYiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fcG9pbnQoYWVzKHRlbXAsIHJhdGUsIGNvbG91ciA9IGN1cnZlX2lkKSwgZmlsdGVyKGNvbWJfZCwgbWV0cmljID09ICJIRiIpLCBzaXplID0gMS41LCBhbHBoYSA9IDAuNiwgCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuNSwgaGVpZ2h0ID0gMCkpICsKICBnZW9tX3JpYmJvbihhZXModGVtcCwgeW1pbiA9IGNvbmZfbG93ZXIsIHltYXggPSBjb25mX3VwcGVyLCBncm91cCA9IGN1cnZlX2lkKSwgZmlsdGVyKGNvbWJfYm9vdF9jb25mX3ByZWRzLCBtZXRyaWMgPT0gIkhGIiksIGZpbGwgPSAnZ3JleTYwJywgYWxwaGEgPSAwLjMpICsKICBnZW9tX2xpbmUoYWVzKHRlbXAsIC5maXR0ZWQsIGNvbCA9IGN1cnZlX2lkKSwgc2l6ZSA9IDIpICsKICAjc2NhbGVfY29sb3JfYnJld2VyKHR5cGUgPSAiZGl2IiwgcGFsZXR0ZSA9IDUsIGRpcmVjdGlvbiA9IC0xKSArIAogICNzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIm1ha28iKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gY29tYl9jb2xvcnMpICsgCiAgbGFicyh4ID0gIlRlbXBlcmF0dXJlIChkZWdyZWVzIEMpIiwgCiAgICAgICB5ID0gIkhhdGNoaW5nIFN1Y2Nlc3MgXG4oJSkiLAogICAgICAgY29sb3VyID0gIk1vbnRoIikgKyAKICB0aGVtZV9tYXR0KGJhc2Vfc2l6ZSA9IDEyKQoKY29tYl9yZl9wbG90ID0gY29tYl9wcmVkcyAlPiUgCiAgZmlsdGVyKG1ldHJpYyA9PSAiUkYiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fcG9pbnQoYWVzKHRlbXAsIHJhdGUsIGNvbG91ciA9IGN1cnZlX2lkKSwgZmlsdGVyKGNvbWJfZCwgbWV0cmljID09ICJSRiIpLCBzaXplID0gMS41LCBhbHBoYSA9IDAuNiwgCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuNSwgaGVpZ2h0ID0gMCkpICsKICBnZW9tX3JpYmJvbihhZXModGVtcCwgeW1pbiA9IGNvbmZfbG93ZXIsIHltYXggPSBjb25mX3VwcGVyLCBncm91cCA9IGN1cnZlX2lkKSwgZmlsdGVyKGNvbWJfYm9vdF9jb25mX3ByZWRzLCBtZXRyaWMgPT0gIlJGIiksIGZpbGwgPSAnZ3JleTYwJywgYWxwaGEgPSAwLjMpICsKICBnZW9tX2xpbmUoYWVzKHRlbXAsIC5maXR0ZWQsIGNvbCA9IGN1cnZlX2lkKSwgc2l6ZSA9IDIpICsKICAjc2NhbGVfY29sb3JfYnJld2VyKHR5cGUgPSAiZGl2IiwgcGFsZXR0ZSA9IDUsIGRpcmVjdGlvbiA9IC0xKSArIAogICNzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIm1ha28iKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gY29tYl9jb2xvcnMpICsgCiAgbGFicyh4ID0gIlRlbXBlcmF0dXJlIChkZWdyZWVzIEMpIiwgCiAgICAgICB5ID0gIlByb2R1Y3Rpb24gXG4ob2Zmc3ByaW5nL2ZlbWFsZS9kYXkpIiwKICAgICAgIGNvbG91ciA9ICJNb250aCIpICsgCiAgdGhlbWVfbWF0dChiYXNlX3NpemUgPSAxMikKCmNvbWJfdHNjID0gZ2dwbG90KGNvbWJfc3VydiwgYWVzKHg9VGVtcCwgeT1TdXJ2LCBjb2xvdXI9TW9udGgpKSArIAogIGdlb21fcG9pbnQoc2l6ZT0xLjUsIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjEsIGhlaWdodD0wLjAzKSkgKwogIHhsYWIoIlN0cmVzcyBUZW1wZXJhdHVyZSIpKwogIHlsYWIoIlN1cnZpdm9yc2hpcCBcbihwcm9wb3J0aW9uIHN1cnZpdmVkKSIpKwogIGxhYnMoY29sb3VyID0gIk1vbnRoIikgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAiZ2xtIiwgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseSA9ICJiaW5vbWlhbCIpLCBzZT1ULCBzaXplID0gMikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKDAsMSkpICsgCiAgI3NjYWxlX2NvbG9yX2JyZXdlcih0eXBlID0gImRpdiIsIHBhbGV0dGUgPSA1LCBkaXJlY3Rpb24gPSAtMSkgKyAKICAjc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWtvIikgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGNvbWJfY29sb3JzKSArIAogIHRoZW1lX21hdHQoYmFzZV9zaXplID0gMTIpCgpnZ2FycmFuZ2UoY29tYl9lcHJfcGxvdCwgYSwgY29tYl9oc19wbG90LCBjb21iX3JmX3Bsb3QsIGEsIGNvbWJfdHNjLCAKICAgICAgICAgIG5jb2wgPSAzLCBucm93ID0gMiwgd2lkdGhzID0gYygxLC4xLDEpLAogICAgICAgICAgY29tbW9uLmxlZ2VuZCA9IFQsIGxlZ2VuZCA9ICJib3R0b20iKQpgYGAKCmBgYHtyIGZpZ3VyZS0zLWN1cnZlLXBhcmFtZXRlcnMsIHdhcm5pbmcgPSBGLCBtZXNzYWdlID0gRiwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9NS41fQpjb21iaW5lZF9vcHRfY29sbCA9IGNvbWJfcGFyYW1zICU+JSAKICBmaWx0ZXIobWV0cmljID09ICJSRiIgJiB0ZXJtID09ICJ0b3B0IikgJT4lIAogIGdncGxvdChhZXMoeCA9IGdyb3d0aF90ZW1wLCB5ID0gZXN0aW1hdGUsIHNoYXBlID0gc3BlY2llcykpICsgCiAgZ2VvbV9zbW9vdGgoZGF0YSA9IGZpbHRlcihjb21iX3BhcmFtcywgbWV0cmljID09ICJSRiIgJiB0ZXJtID09ICJ0b3B0IiAmIGN1cnZlX2lkICE9ICJOb3ZlbWJlcl8yIiksCiAgICAgICAgICAgICAgbWV0aG9kID0gImxtIiwgY29sb3VyID0gImdyZXk1MCIpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMywgc3Ryb2tlID0gMSkgKyAKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNiwyMSkpICsgCiAgeWxhYigiT3B0aW11bSAoZGVncmVlcyBDKSIpICsgCiAgeGxhYigiQ29sbGVjdGlvbiBUZW1wZXJhdHVyZSAoZGVncmVlcyBjKSIpICsgCiAgbGFicyhjb2xvdXIgPSAiTW9udGgiKSArIAogIHRoZW1lX21hdHQoYmFzZV9zaXplID0gMTIpCgpjb21iaW5lZF9vcHRfZGlmZiA9IGNvbWJfcGFyYW1zICU+JSAKICBmaWx0ZXIobWV0cmljID09ICJSRiIgJiB0ZXJtID09ICJ0b3B0IikgJT4lIAogIGdncGxvdChhZXMoeCA9IGdyb3d0aF90ZW1wLCB5ID0gbWFyZ2luLCBzaGFwZSA9IHNwZWNpZXMpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgc2l6ZSA9MSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fc21vb3RoKGRhdGEgPSBmaWx0ZXIoY29tYl9wYXJhbXMsIG1ldHJpYyA9PSAiUkYiICYgdGVybSA9PSAidG9wdCIgJiBjdXJ2ZV9pZCAhPSAiTm92ZW1iZXJfMiIpLAogICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJncmV5NTAiKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIHN0cm9rZSA9IDEpICsgCiAgeWxhYigiTWFyZ2luIChkZWdyZWVzIEMpIikgKyAKICB4bGFiKCJDb2xsZWN0aW9uIFRlbXBlcmF0dXJlIChkZWdyZWVzIGMpIikgKyAKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNiwyMSkpICsgCiAgdGhlbWVfbWF0dChiYXNlX3NpemUgPSAxMikgCgpjb21iaW5lZF9sZF9jb2xsID0gZ2dwbG90KGNvbWJpbmVkX3RvbGVyYW5jZSwgYWVzKHggPSBDb2xsX3RlbXAsIHkgPSBMRDUwLCBzaGFwZSA9IHNwZWNpZXMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJncmV5NTAiKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIHN0cm9rZSA9IDEpICsgCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTYsMjEpKSArIAogIHlsYWIoIlRoZXJtYWwgVG9sZXJhbmNlIChkZWdyZWVzIEMpIikgKyAKICB4bGFiKCJDb2xsZWN0aW9uIFRlbXBlcmF0dXJlIChkZWdyZWVzIGMpIikgKyAKICB0aGVtZV9tYXR0KGJhc2Vfc2l6ZSA9IDEyKQoKY29tYmluZWRfbGRfZGlmZiA9IGdncGxvdChjb21iaW5lZF90b2xlcmFuY2UsIGFlcyh4ID0gQ29sbF90ZW1wLCB5ID0gbWFyZ2luLCBzaGFwZSA9IHNwZWNpZXMpKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3VyID0gImdyZXk1MCIpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMywgc3Ryb2tlID0gMSkgKyAKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNiwyMSkpICsgCiAgeWxhYigiV2FybWluZyBUb2xlcmFuY2UgKGRlZ3JlZXMgQykiKSArIAogIHhsYWIoIkNvbGxlY3Rpb24gVGVtcGVyYXR1cmUgKGRlZ3JlZXMgYykiKSArIAogIHRoZW1lX21hdHQoYmFzZV9zaXplID0gMTIpCgpnZ2FycmFuZ2UoY29tYmluZWRfb3B0X2NvbGwsIGNvbWJpbmVkX29wdF9kaWZmLCBjb21iaW5lZF9sZF9jb2xsLCBjb21iaW5lZF9sZF9kaWZmLCBuY29sID0gMiwgbnJvdyA9IDIsIGNvbW1vbi5sZWdlbmQgPSBULCBsZWdlbmQgPSAiYm90dG9tIikKYGBgCgpgYGB7cn0KRjBfcmZfc3VtbWFyeSRtb250aCA9IGZhY3RvcihGMF9yZl9zdW1tYXJ5JG1vbnRoLCBsZXZlbHMgPSBjKCJKdW5lIiwgIkF1Z3VzdCIsICJOb3ZlbWJlciIpKQpGMF9yZl9zdW1tYXJ5JGR1cmF0aW9uID0gZmFjdG9yKEYwX3JmX3N1bW1hcnkkZHVyYXRpb24sIGxldmVscyA9IGMoInNob3J0IiwgImxvbmciKSkKRjBfZHVyX3N1bW1hcnkkbW9udGggPSBmYWN0b3IoRjBfZHVyX3N1bW1hcnkkbW9udGgsIGxldmVscyA9IGMoIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIikpCgpwYXJhbV9saXN0ID0gbGlzdCgpCnBhcmFtX2xpc3RbWyJjb2xvdXIiXV0gPSAiYmxhY2siCnBhcmFtX2xpc3RbWyJ3aWR0aCJdXSA9IDAuMgoKUkZfc2hvcnRfZGIgPSBwbG90KEYwX1JGX3Nob3J0LCAKICAgICAgICAgICAgICAgICAgIGF4ZXMudGl0bGUuZm9udHNpemUgPSAxMCwKICAgICAgICAgICAgICAgICAgIHRpY2suZm9udHNpemUgPSAxMCwKICAgICAgICAgICAgICAgICAgIGVmZnNpemUubWFya2Vyc2l6ZSA9IDMsCiAgICAgICAgICAgICAgICAgICBzd2FybXBsb3QucGFyYW1zID0gcGFyYW1fbGlzdCwKICAgICAgICAgICAgICAgICAgIHJhd3Bsb3QueWxhYmVsID0gIlByb2R1Y3Rpb24iLAogICAgICAgICAgICAgICAgICAgdGhlbWUgPSBnZ3B1YnI6OnRoZW1lX3B1YnIoKSkKClJGX2xvbmdfZGIgPSBwbG90KEYwX1JGX2xvbmcsIAogICAgICAgICAgICAgICAgICBheGVzLnRpdGxlLmZvbnRzaXplID0gMTAsCiAgICAgICAgICAgICAgICAgIHRpY2suZm9udHNpemUgPSAxMCwKICAgICAgICAgICAgICAgICAgZWZmc2l6ZS5tYXJrZXJzaXplID0gMywKICAgICAgICAgICAgICAgICAgc3dhcm1wbG90LnBhcmFtcyA9IHBhcmFtX2xpc3QsCiAgICAgICAgICAgICAgICAgIHJhd3Bsb3QueWxhYmVsID0gIlByb2R1Y3Rpb24iLAogICAgICAgICAgICAgICAgICB0aGVtZSA9IGdncHVicjo6dGhlbWVfcHVicigpKQoKYjEgPSBnZ3Bsb3QoKSArIHRoZW1lX3B1YmNsZWFuKCkgKyBnZ3RpdGxlKCIgICAgICAgICAgU2hvcnQgSGVhdCBXYXZlcyIpCmIyID0gZ2dwbG90KCkgKyB0aGVtZV9wdWJjbGVhbigpICsgZ2d0aXRsZSgiICAgICAgICAgIExvbmcgSGVhdCBXYXZlcyIpCkYwX2ZlY3VuZGl0eV9wbG90ID0gZ2dhcnJhbmdlKGIxLCBSRl9zaG9ydF9kYiwgYjIsIFJGX2xvbmdfZGIsIG5jb2wgPSAxLCBucm93ID0gNCwgaGVpZ2h0cyA9IGMoMC4xLCAxLCAwLjEsIDEpKQpgYGAKCmBgYHtyIGZpZ3VyZS00LXNpbS1oZWF0d2F2ZS1lZmZlY3RzLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD01fQp4LmF4aXNfbGFiZWxzID0gYygiMSIgPSAic2hvcnQiLCAiMiIgPSAibG9uZyIsICIzIiA9ICJzaG9ydCIsICI0IiA9ICJsb25nIikKCkYwX2dyaWQgPSBGMF9yZl9zdW1tYXJ5ICU+JSAKICBtdXRhdGUobW9udGggPSBmY3RfcmVsZXZlbChtb250aCwgIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIikpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBkdXJhdGlvbiwgeSA9IGRpZmZlcmVuY2UsIGNvbG91ciA9IHRyYWl0LCBzaGFwZSA9IGR1cmF0aW9uKSkgKyAKICBmYWNldF9ncmlkKC4gfiBtb250aCkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC4zKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGJjYV9jaV9sb3csIHltYXggPSBiY2FfY2lfaGlnaCksIHdpZHRoID0gMCwgc2l6ZSA9IDEuMykgKyAKICBnZW9tX3BvaW50KHNpemUgPSA1LCBmaWxsID0gIndoaXRlIikgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImJvZHkgc2l6ZSIgPSAiZ3JleTgwIiwgInByb2R1Y3Rpb24iID0gImJsYWNrIikpICsgCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoImxvbmciID0gMTYsICJzaG9ydCIgPSAyMSkpICsgCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9IHguYXhpc19sYWJlbHMpICsKICBnZ3RpdGxlKCJEaXJlY3QgRWZmZWN0cyAoRjApIikgKyAKICB4bGFiKCIiKSArCiAgeWxhYigiRWZmZWN0IFNpemVcbkhlYXR3YXZlIC0gQ29udHJvbCIpICsgCiAgeWxpbSgtMSwxLjEpICsgCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTIpICsgCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtNDUsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKCkYxX3N1bW1hcnkgPSBiaW5kX3Jvd3MoRjFfcmZfZWZmZWN0X3NpemUsIEYxX2JzX2VmZmVjdF9zaXplKSAlPiUgCiAgZHBseXI6OnNlbGVjdCh2YXJpYWJsZSwgZGlmZmVyZW5jZSwgYmNhX2NpX2xvdywgYmNhX2NpX2hpZ2gsIG1vbnRoLCBkdXJhdGlvbiwgdHJhaXQsIGdlbmVyYXRpb24sIG9mZl90ZW1wKSAlPiUgCiAgbXV0YXRlKCJvcmRlcl9jb2RlIiA9IHBhc3RlKHRyYWl0LCBkdXJhdGlvbiwgc2VwID0gIl8iKSwKICAgICAgICAgIm9yZGVyX251bWJlciIgPSBjYXNlX3doZW4oCiAgICAgICAgICAgb3JkZXJfY29kZSA9PSAicHJvZHVjdGlvbl9zaG9ydCIgfiAxLAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInByb2R1Y3Rpb25fbG9uZyIgfiAyLAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gImJvZHkgc2l6ZV9zaG9ydCIgfiAzLAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gImJvZHkgc2l6ZV9sb25nIiB+IDQpLAogICAgICAgICBtb250aCA9IGZjdF9yZWxldmVsKG1vbnRoLCAiSnVuZSIsICJBdWd1c3QiLCAiTm92ZW1iZXIiKSkKCkYxX3N1bW1hcnkkb3JkZXJfbnVtYmVyID0gZmFjdG9yKEYxX3N1bW1hcnkkb3JkZXJfbnVtYmVyLCBsZXZlbHMgPSBjKDEsMiwzLDQpKQpGMV9ncmlkID0gZ2dwbG90KEYxX3N1bW1hcnksIGFlcyh4ID0gb3JkZXJfbnVtYmVyLCB5ID0gZGlmZmVyZW5jZSwgY29sb3VyID0gdHJhaXQsIHNoYXBlID0gZHVyYXRpb24sIGdyb3VwID0gdHJhaXQpKSArCiAgZmFjZXRfZ3JpZChvZmZfdGVtcCB+IG1vbnRoLCApICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuMykgKwogIGdlb21fbGluZSgpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGJjYV9jaV9sb3csIHltYXggPSBiY2FfY2lfaGlnaCksIHdpZHRoID0gMCwgc2l6ZSA9IDEpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMywgZmlsbCA9ICJ3aGl0ZSIpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJib2R5IHNpemUiID0gImdyZXk3NSIsICJwcm9kdWN0aW9uIiA9ICJibGFjayIpKSArIAogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJsb25nIiA9IDE2LCAic2hvcnQiID0gMjEpKSArIAogIHhsaW0oMC41LDQuNSkgKyAKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz0geC5heGlzX2xhYmVscykgKwogIHhsYWIoIiIpICsKICB5bGFiKCJFZmZlY3QgU2l6ZVxuSGVhdHdhdmUgLSBDb250cm9sIikgKyAKICBnZ3RpdGxlKCJUcmFuc2dlbmVyYXRpb25hbCBFZmZlY3RzIChGMSkiKSArIAogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDEyKSArIAogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtNDUsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpKQoKZ2dhcnJhbmdlKEYwX2dyaWQsIEYxX2dyaWQsIG5yb3cgPSAyLCBuY29sID0gMSwgaGVpZ2h0cyA9IGMoMC40NSwxKSwgY29tbW9uLmxlZ2VuZCA9IFQsIGxlZ2VuZCA9ICJyaWdodCIpCmBgYAoKIyMgU3VwcGxlbWVudGFsIEluZm9ybWF0aW9uICAgCmBgYHtyIHBhcmFtZXRlcnMtbW9udGgsIGZpZy5oZWlnaHQ9OSwgZmlnLndpZHRoPTExfQojZmllbGQgdHBjIHBhcmFtZXRlcnMKY29tYl9wYXJhbXMgJT4lICAKICBtdXRhdGUoY3VydmVfaWQgPSBmY3RfcmVsZXZlbChjdXJ2ZV9pZCwgYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBjdXJ2ZV9pZCwgeSA9IGVzdGltYXRlLCBjb2xvdXIgPSBzcGVjaWVzKSkgKwogIGZhY2V0X3dyYXAodGVybX5tZXRyaWMsIHNjYWxlcyA9ICdmcmVlX3knKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsKICBnZW9tX2xpbmVyYW5nZShhZXMoeW1pbiA9IGNvbmZfbG93ZXIsIHltYXggPSBjb25mX3VwcGVyKSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygicm95YWxibHVlMSIsICJpbmRpYW5yZWQyIikpICsgCiAgbGFicyh4ID0gIk1vbnRoIiwKICAgICAgIHkgPSAiUGFyYW1ldGVyIEVzdGltYXRlIiwKICAgICAgIGNvbG91ciA9ICJTcGVjaWVzIikgKyAKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMTUsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpKQpgYGAKCmBgYHtyIHBhcmFtZXRlcnMtY29sbC10ZW1wLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05fQojZmllbGQgdHBjIHBhcmFtZXRlcnMKZ2dwbG90KGNvbWJfcGFyYW1zLCBhZXMoeCA9IGdyb3d0aF90ZW1wLCB5ID0gZXN0aW1hdGUsIGNvbG91ciA9IHNwZWNpZXMpKSArCiAgZmFjZXRfd3JhcCh0ZXJtfm1ldHJpYywgc2NhbGVzID0gJ2ZyZWVfeScpICsgCiAgZ2VvbV9zbW9vdGgoZGF0YSA9IGZpbHRlcihjb21iX3BhcmFtcywgY3VydmVfaWQgIT0gIk5vdmVtYmVyXzIiKSwKICAgICAgICAgICAgICBtZXRob2QgPSAibG0iLCBzZSA9IEYpICsgCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKwogIGdlb21fbGluZXJhbmdlKGFlcyh5bWluID0gY29uZl9sb3dlciwgeW1heCA9IGNvbmZfdXBwZXIpKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJyb3lhbGJsdWUxIiwgImluZGlhbnJlZDIiKSkgKyAKICBsYWJzKHggPSAiQ29sbGVjdGlvbiBUZW1wZXJhdHVyZSAoZGVncmVlcyBDKSIsCiAgICAgICB5ID0gIlBhcmFtZXRlciBFc3RpbWF0ZSIsCiAgICAgICBjb2xvdXIgPSAiU3BlY2llcyIpICsgCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTIpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCmBgYHtyIG1hcmdpbnMtY29sbC10ZW1wLCBmaWcuaGVpZ2h0PTksIGZpZy53aWR0aD03fQpjb21iX3BhcmFtcyAlPiUgCiAgZmlsdGVyKHRlcm0gPT0gInRvcHQiKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZ3Jvd3RoX3RlbXAsIHkgPSBtYXJnaW4sIGNvbG91ciA9IHNwZWNpZXMsIGdyb3VwID0gc3BlY2llcykpICsgCiAgZmFjZXRfZ3JpZChtZXRyaWN+Liwgc2NhbGVzID0gJ2ZyZWVfeScpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fc21vb3RoKGRhdGEgPSBmaWx0ZXIoY29tYl9wYXJhbXMsIHRlcm0gPT0gInRvcHQiICYgY3VydmVfaWQgIT0gIk5vdmVtYmVyXzIiKSwKICAgICAgICAgICAgICBtZXRob2QgPSAibG0iLCBzZSA9IEYsIHNpemUgPSAyKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoInJveWFsYmx1ZTEiLCAiaW5kaWFucmVkMiIpKSArIAogIGxhYnMoeCA9ICJDb2xsZWN0aW9uIFRlbXBlcmF0dXJlIiwKICAgICAgIHkgPSAiU2FmZXR5IE1hcmdpbiIpICsgCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTgpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCmBgYHtyIGVmZmVjdC1zaXplLWdyaWQsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTh9CiNTdWJzZXF1ZW50IFJvd3MKRjFfaHNfZWZmZWN0X3NpemUkdHJhaXQgPSAic3VjY2VzcyIKRjFfaHNfZWZmZWN0X3NpemUkZ2VuZXJhdGlvbiA9ICJGMSIKCkYxX3RvdGFsX2VmZmVjdF9zaXplJHRyYWl0ID0gImVwciIKRjFfdG90YWxfZWZmZWN0X3NpemUkZ2VuZXJhdGlvbiA9ICJGMSIKCkYxX3JmX2VmZmVjdF9zaXplJHRyYWl0ID0gInByb2R1Y3Rpb24iCkYxX3JmX2VmZmVjdF9zaXplJGdlbmVyYXRpb24gPSAiRjEiCgpGMV9ic19lZmZlY3Rfc2l6ZSR0cmFpdCA9ICJzaXplIgpGMV9ic19lZmZlY3Rfc2l6ZSRnZW5lcmF0aW9uID0gIkYxIgoKRjBfZGF0YSA9IGJpbmRfcm93cyhGMF9oc19zdW1tYXJ5LCBGMF90b3RhbF9zdW1tYXJ5LEYwX3JmX3N1bW1hcnksIEYwX3NpemVfc3VtbWFyeSkgJT4lIAogIGRwbHlyOjpzZWxlY3QodHJhaXQsIGRpZmZlcmVuY2UsIGJjYV9jaV9sb3csIGJjYV9jaV9oaWdoLCBtb250aCwgZHVyYXRpb24sIHRyYWl0LCBnZW5lcmF0aW9uKSAlPiUgCiAgbXV0YXRlKCJvcmRlcl9jb2RlIiA9IHBhc3RlKHRyYWl0LCBkdXJhdGlvbiwgc2VwID0gIl8iKSwKICAgICAgICAgIm9yZGVyX251bWJlciIgPSBjYXNlX3doZW4oCiAgICAgICAgICAgb3JkZXJfY29kZSA9PSAidG90YWxfc2hvcnQiIH4gMSwKICAgICAgICAgICBvcmRlcl9jb2RlID09ICJ0b3RhbF9sb25nIiB+IDIsCiAgICAgICAgICAgb3JkZXJfY29kZSA9PSAic3VjY2Vzc19zaG9ydCIgfiAzLAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInN1Y2Nlc3NfbG9uZyIgfiA0LAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInByb2R1Y3Rpb25fc2hvcnQiIH4gNSwKICAgICAgICAgICBvcmRlcl9jb2RlID09ICJwcm9kdWN0aW9uX2xvbmciIH4gNiwKICAgICAgICAgICBvcmRlcl9jb2RlID09ICJzaXplX2xvbmciIH4gNyksCiAgICAgICAgIG1vbnRoID0gZmN0X3JlbGV2ZWwobW9udGgsICJKdW5lIiwgIkF1Z3VzdCIsICJOb3ZlbWJlciIpLAogICAgICAgICB0cmFpdCA9IGZjdF9yZWxldmVsKHRyYWl0LCAidG90YWwiLCAic3VjY2VzcyIsICJwcm9kdWN0aW9uIiwgInNpemUiKSwKICAgICAgICAgZHVyYXRpb24gPSBmY3RfcmVsZXZlbChkdXJhdGlvbiwgInNob3J0IiwgImxvbmciKSkKCkYwX2RhdGEkb3JkZXJfbnVtYmVyID0gZmFjdG9yKEYwX2RhdGEkb3JkZXJfbnVtYmVyLCBsZXZlbHMgPSBjKDEsMiwzLDQsNSw2LDcpKQoKCkYxX2RhdGEgPSBiaW5kX3Jvd3MoRjFfdG90YWxfZWZmZWN0X3NpemUsIEYxX2hzX2VmZmVjdF9zaXplLCBGMV9yZl9lZmZlY3Rfc2l6ZSwgRjFfYnNfZWZmZWN0X3NpemUpICU+JSAKICBkcGx5cjo6c2VsZWN0KHRyYWl0LCBkaWZmZXJlbmNlLCBiY2FfY2lfbG93LCBiY2FfY2lfaGlnaCwgbW9udGgsIGR1cmF0aW9uLCBnZW5lcmF0aW9uLCBvZmZfdGVtcCkgJT4lIAogIG11dGF0ZSgib3JkZXJfY29kZSIgPSBwYXN0ZSh0cmFpdCwgZHVyYXRpb24sIHNlcCA9ICJfIiksCiAgICAgICAgICJvcmRlcl9udW1iZXIiID0gY2FzZV93aGVuKAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gImVwcl9zaG9ydCIgfiAxLAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gImVwcl9sb25nIiB+IDIsCiAgICAgICAgICAgb3JkZXJfY29kZSA9PSAic3VjY2Vzc19zaG9ydCIgfiAzLAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInN1Y2Nlc3NfbG9uZyIgfiA0LAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInByb2R1Y3Rpb25fc2hvcnQiIH4gNSwKICAgICAgICAgICBvcmRlcl9jb2RlID09ICJwcm9kdWN0aW9uX2xvbmciIH4gNiwKICAgICAgICAgICBvcmRlcl9jb2RlID09ICJzaXplX3Nob3J0IiB+IDcsCiAgICAgICAgICAgb3JkZXJfY29kZSA9PSAic2l6ZV9sb25nIiB+IDgpLAogICAgICAgICB0cmFpdCA9IGlmX2Vsc2UodHJhaXQgPT0gImVwciIsICJ0b3RhbCIsIHRyYWl0KSwKICAgICAgICAgbW9udGggPSBmY3RfcmVsZXZlbChtb250aCwgIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIiksCiAgICAgICAgIHRyYWl0ID0gZmN0X3JlbGV2ZWwodHJhaXQsICJ0b3RhbCIsICJzdWNjZXNzIiwgInByb2R1Y3Rpb24iLCAic2l6ZSIpLAogICAgICAgICBkdXJhdGlvbiA9IGZjdF9yZWxldmVsKGR1cmF0aW9uLCAic2hvcnQiLCAibG9uZyIpKQoKCkYxX2RhdGEkb3JkZXJfbnVtYmVyID0gZmFjdG9yKEYxX2RhdGEkb3JkZXJfbnVtYmVyLCBsZXZlbHMgPSBjKDEsMiwzLDQsNSw2LDcsOCkpCgojVG9wIHJvdyAtIEYwIChkaXJlY3QgZWZmZWN0cykKeC5heGlzX2xhYmVscyA9IGMoIjEiID0gInNob3J0IiwgIjIiID0gImxvbmciLCAiMyIgPSAic2hvcnQiLCAiNCIgPSAibG9uZyIsICI1IiA9ICJzaG9ydCIsICI2IiA9ICJsb25nIiwgIjciID0gInNob3J0IiwgIjgiID0gImxvbmciKQoKRjBfZ3JpZCA9IGdncGxvdChGMF9kYXRhLCBhZXMoeCA9IGR1cmF0aW9uLCB5ID0gZGlmZmVyZW5jZSwgY29sb3VyID0gdHJhaXQsIHNoYXBlID0gZHVyYXRpb24pKSArIAogIGZhY2V0X2dyaWQoLiB+IG1vbnRoKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAwLjMpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gYmNhX2NpX2xvdywgeW1heCA9IGJjYV9jaV9oaWdoKSwgd2lkdGggPSAwLCBzaXplID0gMSwgCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC43KSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSA0LCBmaWxsID0gIndoaXRlIiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNykpICsgCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoImxvbmciID0gMTYsICJzaG9ydCIgPSAyMSkpICsgCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9IHguYXhpc19sYWJlbHMpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoInNpemUiID0gImRhcmtncmV5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiID0gImdvbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvZHVjdGlvbiIgPSAiZm9yZXN0Z3JlZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG90YWwiID0gImNvcm5mbG93ZXJibHVlIikpICsgIAogIHhsYWIoIiIpICsKICB5bGFiKCJFZmZlY3QgU2l6ZVxuSGVhdHdhdmUgLSBDb250cm9sIikgKyAKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMikgKyAKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IC00NSwgaGp1c3QgPSAwLCB2anVzdCA9IDAuNSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKI0ZvbGxvd2luZyB0aHJlZSByb3dzIC0gRjEgKHRyYW5zZ2VuZXJhdGlvbiAvIGluZGlyZWN0IGVmZmVjdHMpCkYxX2dyaWQgPSBnZ3Bsb3QoRjFfZGF0YSwgYWVzKHggPSBkdXJhdGlvbiwgeSA9IGRpZmZlcmVuY2UsIGNvbG91ciA9IHRyYWl0LCBzaGFwZSA9IGR1cmF0aW9uLCBncm91cCA9IHRyYWl0KSkgKyAKICBmYWNldF9ncmlkKG9mZl90ZW1wIH4gbW9udGgsICkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC4zKSArCiAgZ2VvbV9saW5lKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBiY2FfY2lfbG93LCB5bWF4ID0gYmNhX2NpX2hpZ2gpLCB3aWR0aCA9IDAsIHNpemUgPSAxLAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMywgZmlsbCA9ICJ3aGl0ZSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArIAogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJsb25nIiA9IDE2LCAic2hvcnQiID0gMjEpKSArIAogIHhsaW0oMC41LDQuNSkgKyAKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz0geC5heGlzX2xhYmVscykgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygic2l6ZSIgPSAiZGFya2dyZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VjY2VzcyIgPSAiZ29sZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9kdWN0aW9uIiA9ICJmb3Jlc3RncmVlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbCIgPSAiY29ybmZsb3dlcmJsdWUiKSkgKyAKICB4bGFiKCIiKSArCiAgeWxhYigiRWZmZWN0IFNpemUiKSArIAogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDEyKSArIAogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtNDUsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpKQoKZ2dhcnJhbmdlKEYwX2dyaWQsIEYxX2dyaWQsIG5yb3cgPSAyLCBuY29sID0gMSwgaGVpZ2h0cyA9IGMoMC4zNSwxKSwgY29tbW9uLmxlZ2VuZCA9IFQsIGxlZ2VuZCA9ICJyaWdodCIpCmBgYAoKYGBge3IgU3VwcC1GaWctMS1GMC10cmVhdGVtZW50LWVmZmVjdHMtZXN0LXBsb3RzLCBmaWcuaGVpZ2h0PTExLCBmaWcud2lkdGg9OH0KRjBfZmVjdW5kaXR5X3Bsb3QKYGBgCgpgYGB7ciBGMC1kdXJhdGlvbi1lZmZlY3RzLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD04fQojRWZmZWN0IG9mIGhlYXR3YXZlIGR1cmF0aW9uIFdJVEhJTiB0cmVhdG1lbnQKRjBfZHVyX3N1bW1hcnkgJT4lIAogIG11dGF0ZShtb250aCA9IGZjdF9yZWxldmVsKG1vbnRoLCBjKCJKdW5lIiwgIkF1Z3VzdCIsICJOb3ZlbWJlciIpKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IG1vbnRoLCBmaWxsID0gdHJlYXRtZW50LCB5ID0gZGlmZmVyZW5jZSkpICsgCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLCBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMSkgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gYmNhX2NpX2xvdywgeW1heCA9IGJjYV9jaV9oaWdoKSwKICAgICAgICAgICAgICAgIHdpZHRoID0gMC4xLCBzaXplID0gMSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZ3JleTMwIiwgIndoaXRlIikpICsgCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIkVmZmVjdCBTaXplIChIZWRnZSdzIGcpIFxuIExvbmcgLSBTaG9ydCBldmVudHMiKSArIAogIHRoZW1lX3B1YnIoYmFzZV9zaXplID0gMTgpCmBgYAoKYGBge3IgRjEtZHVyYXRpb24tZWZmZWN0cywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9OH0KIyBIb3cgZG9lcyBoZWF0IHdhdmUgZHVyYXRpb24gYWZmZWN0IHRyYW5zZ2VuZXJhdGlvbmFsIGVmZmVjdHM/IFJlYWN0aW9uIG5vcm1zIHNob3duIGJlbG93IGZvciBlZmZlY3Qgc2l6ZSBjb21wYXJpc29ucyAoaGVhdHdhdmUgLSBjb250cm9sKSBmb3IgZGlmZmVyZW50IGR1cmF0aW9uIG9mIHBhcmVudGFsIGV4cG9zdXJlCkYxX2RhdGEgJT4lIAogIGRwbHlyOjpzZWxlY3QobW9udGgsIGR1cmF0aW9uLCBvZmZfdGVtcCwgdHJhaXQsIGRpZmZlcmVuY2UsIGJjYV9jaV9sb3csIGJjYV9jaV9oaWdoKSAlPiUgCiAgbXV0YXRlKCJJRCIgPSBwYXN0ZShtb250aCwgb2ZmX3RlbXAsIHRyYWl0LCBzZXAgPSAiXyIpLAogICAgICAgICBtb250aCA9IGZjdF9yZWxldmVsKG1vbnRoLCBjKCJKdW5lIiwgIkF1Z3VzdCIsICJOb3ZlbWJlciIpKSwKICAgICAgICAgZHVyYXRpb24gPSBmY3RfcmVsZXZlbChkdXJhdGlvbiwgYygic2hvcnQiLCAibG9uZyIpKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGR1cmF0aW9uLCB5ID0gZGlmZmVyZW5jZSwgY29sb3VyID0gbW9udGgsIGdyb3VwID0gSUQpKSArIAogIGZhY2V0X3dyYXAodHJhaXR+LikgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIAogIGdlb21fbGluZShzaXplID0gMSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMSkpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMSkpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGJjYV9jaV9sb3csIHltYXggPSBiY2FfY2lfaGlnaCksCiAgICAgICAgICAgICAgICBzaXplID0gMC43NSwgd2lkdGggPSAwLjEsCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4xKSkgKyAKICBsYWJzKHggPSAiUGFyZW50YWwgRXhwb3N1cmUgRHVyYXRpb24iLCAKICAgICAgIHkgPSAiRWZmZWN0IFNpemUgKEhlZGdlJ3MgZykgXG4gSGVhdHdhdmUgLSBDb250cm9sIikgKyAKICB5bGltKC01LDUpICsgCiAgdGhlbWVfcHVicihiYXNlX3NpemUgPSAxOCkKYGBgCgoKYGBge3Igc2lnLUYxLWR1cmF0aW9uLWVmZmVjdHMsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTh9CmR1cmF0aW9uX2VmZmVjdHMgPSBGMV9kYXRhICU+JSAKICBkcGx5cjo6c2VsZWN0KG1vbnRoLCBkdXJhdGlvbiwgb2ZmX3RlbXAsIHRyYWl0LCBkaWZmZXJlbmNlLCBiY2FfY2lfbG93LCBiY2FfY2lfaGlnaCkgJT4lIAogIG11dGF0ZSgiSUQiID0gcGFzdGUobW9udGgsIG9mZl90ZW1wLCB0cmFpdCwgc2VwID0gIl8iKSwKICAgICAgICAgbW9udGggPSBmY3RfcmVsZXZlbChtb250aCwgYygiSnVuZSIsICJBdWd1c3QiLCAiTm92ZW1iZXIiKSksCiAgICAgICAgIGR1cmF0aW9uID0gZmN0X3JlbGV2ZWwoZHVyYXRpb24sIGMoInNob3J0IiwgImxvbmciKSkpICU+JSAKICBncm91cF9ieShJRCwgdHJhaXQsIGR1cmF0aW9uKSAlPiUgIAogIG11dGF0ZSgiemVyb19kaWZmIiA9IGNhc2Vfd2hlbigKICAgIHNpZ24oYmNhX2NpX2xvdykgPT0gc2lnbihiY2FfY2lfaGlnaCkgfiAiZG9lcyBub3Qgb3ZlcmxhcCB6ZXJvIiwKICAgIHNpZ24oYmNhX2NpX2xvdykgIT0gc2lnbihiY2FfY2lfaGlnaCkgfiAib3ZlcmxhcHMgemVybyIKICApKSAlPiUgCiAgdW5ncm91cChkdXJhdGlvbikgJT4lIAogIG11dGF0ZSgiY2hhbmdlIiA9IGNhc2Vfd2hlbigKICAgIHNpZ24oZGlmZmVyZW5jZSlbMV0gPT0gc2lnbihkaWZmZXJlbmNlKVsyXSAmIHplcm9fZGlmZlsxXSA9PSB6ZXJvX2RpZmZbMl0gfiAiU2FtZSIsCiAgICBzaWduKGRpZmZlcmVuY2UpWzFdICE9IHNpZ24oZGlmZmVyZW5jZSlbMl0gJiB6ZXJvX2RpZmZbMV0gPT0gIm92ZXJsYXBzIHplcm8iICYgemVyb19kaWZmWzJdID09ICJvdmVybGFwcyB6ZXJvIiB+ICJTYW1lIiwKICAgIHNpZ24oZGlmZmVyZW5jZSlbMV0gIT0gc2lnbihkaWZmZXJlbmNlKVsyXSAmIHplcm9fZGlmZlsxXSA9PSB6ZXJvX2RpZmZbMl0gJiB6ZXJvX2RpZmZbMV0gPT0gImRvZXMgbm90IG92ZXJsYXAgemVybyIgfiAiRGlmZmVyZW50IiwKICAgIHNpZ24oZGlmZmVyZW5jZSlbMV0gIT0gc2lnbihkaWZmZXJlbmNlKVsyXSAmIHplcm9fZGlmZlsxXSAhPSB6ZXJvX2RpZmZbMl0gfiAiRGlmZmVyZW50IiwKICAgIHNpZ24oZGlmZmVyZW5jZSlbMV0gPT0gc2lnbihkaWZmZXJlbmNlKVsyXSAmIHplcm9fZGlmZlsxXSAhPSB6ZXJvX2RpZmZbMl0gfiAiRGlmZmVyZW50IgogICkpICU+JSAKICBhcnJhbmdlKG1vbnRoLCBvZmZfdGVtcCwgdHJhaXQpICU+JSAKICBmaWx0ZXIoY2hhbmdlID09ICJEaWZmZXJlbnQiKQoKc2VsZWN0X3Jub3JtcyA9IGR1cmF0aW9uX2VmZmVjdHMgJT4lIAogIGRwbHlyOjpzZWxlY3QoLWR1cmF0aW9uLCAtZGlmZmVyZW5jZSwgLWJjYV9jaV9sb3csIC1iY2FfY2lfaGlnaCwgLUlELCAtemVyb19kaWZmKSAlPiUgCiAgZGlzdGluY3QoKQoKc2lnX2NoYW5nZXMgPSBGMV9kYXRhICU+JSAKICBkcGx5cjo6c2VsZWN0KG1vbnRoLCBkdXJhdGlvbiwgb2ZmX3RlbXAsIHRyYWl0LCBkaWZmZXJlbmNlLCBiY2FfY2lfbG93LCBiY2FfY2lfaGlnaCkgJT4lIAogIG11dGF0ZSgiSUQiID0gcGFzdGUobW9udGgsIG9mZl90ZW1wLCB0cmFpdCwgc2VwID0gIl8iKSwKICAgICAgICAgbW9udGggPSBmY3RfcmVsZXZlbChtb250aCwgYygiSnVuZSIsICJBdWd1c3QiLCAiTm92ZW1iZXIiKSksCiAgICAgICAgIGR1cmF0aW9uID0gZmN0X3JlbGV2ZWwoZHVyYXRpb24sIGMoInNob3J0IiwgImxvbmciKSkpICU+JSAKICBmaWx0ZXIoSUQgJWluJSBzZWxlY3Rfcm5vcm1zJElEKQoKZ2dwbG90KHNpZ19jaGFuZ2VzLCBhZXMoeCA9IGR1cmF0aW9uLCB5ID0gZGlmZmVyZW5jZSwgY29sb3VyID0gbW9udGgsIGdyb3VwID0gSUQpKSArIAogIGZhY2V0X3dyYXAodHJhaXR+LikgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIAogIGdlb21fbGluZShzaXplID0gMSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMSkpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMSkpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGJjYV9jaV9sb3csIHltYXggPSBiY2FfY2lfaGlnaCksCiAgICAgICAgICAgICAgICBzaXplID0gMC43NSwgd2lkdGggPSAwLjEsCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4xKSkgKyAKICBnZW9tX2xhYmVsX3JlcGVsKGRhdGEgPSBzaWdfY2hhbmdlcyAlPiUgZmlsdGVyKGR1cmF0aW9uID09ICJsb25nIiksIAogICAgICAgICAgICAgICAgICAgYWVzKGxhYmVsID0gb2ZmX3RlbXAsIAogICAgICAgICAgICAgICAgICAgICAgIHggPSBkdXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICB5ID0gZGlmZmVyZW5jZSwgCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBtb250aCksCiAgICAgICAgICAgICAgICAgICBib3gucGFkZGluZyA9IDAuNSwKICAgICAgICAgICAgICAgICAgIG51ZGdlX3ggPSAwLjIsCiAgICAgICAgICAgICAgICAgICBzaXplID0gNywKICAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kPUZBTFNFKSArIAogIGxhYnMoeCA9ICJQYXJlbnRhbCBFeHBvc3VyZSBEdXJhdGlvbiIsIAogICAgICAgeSA9ICJFZmZlY3QgU2l6ZSAoSGVkZ2UncyBnKVxuSGVhdHdhdmUgLSBDb250cm9sIikgKyAKICB5bGltKC01LDUpICsgCiAgdGhlbWVfcHVicihiYXNlX3NpemUgPSAxOCkKYGBgCgoKYGBge3J9CnJkYXRhID0gZmlsZV9saXN0W3N0cl9kZXRlY3QoZmlsZV9saXN0LCBwYXR0ZXJuID0gIi5SRGF0YSIpXQpmMV9kYXRhID0gcmRhdGFbc3RyX2RldGVjdChyZGF0YSwgcGF0dGVybiA9ICJGMF8iLCBuZWdhdGUgPSBUKV0gJT4lIAogIHN0cl9zcGxpdF9maXhlZChwYXR0ZXJuID0gIi5SRGF0YSIsIG4gPSAyKQpmMV9kYXRhID0gZjFfZGF0YVssMV0KCnBsb3RfbmFtZXMgPSBjKCkKZm9yKGkgaW4gMTpsZW5ndGgoZjFfZGF0YSkpewogIHBsb3RfbmFtZSA9IHBhc3RlKGYxX2RhdGFbaV0sICJfcGxvdCIsIHNlcCA9ICIiKQogIHBsb3RfbmFtZXMgPSBjKHBsb3RfbmFtZXMsIHBsb3RfbmFtZSkKICBtZXRyaWMgPSBzdHJfc3BsaXRfZml4ZWQocGxvdF9uYW1lLCBwYXR0ZXJuID0gIl8iLCBuID0gNClbLDJdCiAgCiAgaWYobWV0cmljID09ICJ0b3RhbCIpewogICAgbGFiZWwgPSAiRWdnIFByb2R1Y3Rpb24gKHBlciBmZW1hbGUpIgogIH0KICAKICBpZihtZXRyaWMgPT0gInJmIil7CiAgICBsYWJlbCA9ICJQcm9kdWN0aW9uIChwZXIgZmVtYWxlKSIKICB9CiAgCiAgaWYobWV0cmljID09ICJocyIpewogICAgbGFiZWwgPSAiSGF0Y2hpbmcgU3VjY2VzcyAoJSkiCiAgfQogIAogIGlmKG1ldHJpYyA9PSAiYnMiKXsKICAgIGxhYmVsID0gIkJvZHkgU2l6ZSAobW0pIgogIH0KICAKICBhc3NpZ24ocGxvdF9uYW1lLAogICAgICAgICBwbG90KGdldChmMV9kYXRhW2ldKSwgCiAgICAgICAgICAgICAgZWZmc2l6ZS5tYXJrZXJzaXplID0gMiwKICAgICAgICAgICAgICBheGVzLnRpdGxlLmZvbnRzaXplID0gOSwKICAgICAgICAgICAgICB0aWNrLmZvbnRzaXplID0gNiwKICAgICAgICAgICAgICBzd2FybXBsb3QucGFyYW1zID0gcGFyYW1fbGlzdCwKICAgICAgICAgICAgICByYXdwbG90LnlsYWJlbCA9IGxhYmVsLAogICAgICAgICAgICAgIHRoZW1lID0gZ2dwdWJyOjp0aGVtZV9wdWJyKCkpKQp9Cgpic19wbG90cyA9IHBsb3RfbmFtZXNbc3RyX2RldGVjdChwbG90X25hbWVzLCBwYXR0ZXJuID0gIl9ic18iKV0KcmZfcGxvdHMgPSBwbG90X25hbWVzW3N0cl9kZXRlY3QocGxvdF9uYW1lcywgcGF0dGVybiA9ICJfcmZfIildCnRvdGFsX3Bsb3RzID0gcGxvdF9uYW1lc1tzdHJfZGV0ZWN0KHBsb3RfbmFtZXMsIHBhdHRlcm4gPSAiX3RvdGFsXyIpXQpoc19wbG90cyA9IHBsb3RfbmFtZXNbc3RyX2RldGVjdChwbG90X25hbWVzLCBwYXR0ZXJuID0gIl9oc18iKV0KYGBgCgpgYGB7ciBGMS1ib2R5LXNpemUtZWZmLXBsb3RzLCBmaWcuaGVpZ2h0PTExLCBmaWcud2lkdGg9OH0KZ2dhcnJhbmdlKEp1bmVfYnNfc2hvcnRfcGxvdCwgSnVuZV9ic19sb25nX3Bsb3QsIAogICAgICAgICAgQXVndXN0X2JzX3Nob3J0X3Bsb3QsIEF1Z3VzdF9ic19sb25nX3Bsb3QsCiAgICAgICAgICBOb3ZlbWJlcl9ic19zaG9ydF9wbG90LCBOb3ZlbWJlcl9ic19sb25nX3Bsb3QsCiAgICAgICAgICBuY29sID0gMiwgbnJvdyA9IDMsCiAgICAgICAgICBsYWJlbHMgPSAiQVVUTyIsCiAgICAgICAgICB2anVzdCA9IC0wLjIpCmBgYAoKYGBge3IgRjEtdG90YWwtZXByLWVmZi1wbG90cywgZmlnLmhlaWdodD0xMSwgZmlnLndpZHRoPTh9CmdnYXJyYW5nZShKdW5lX3RvdGFsX3Nob3J0X3Bsb3QsIEp1bmVfdG90YWxfbG9uZ19wbG90LCAKICAgICAgICAgIEF1Z3VzdF90b3RhbF9zaG9ydF9wbG90LCBBdWd1c3RfdG90YWxfbG9uZ19wbG90LAogICAgICAgICAgTm92ZW1iZXJfdG90YWxfc2hvcnRfcGxvdCwgTm92ZW1iZXJfdG90YWxfbG9uZ19wbG90LAogICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAzLAogICAgICAgICAgbGFiZWxzID0gIkFVVE8iLAogICAgICAgICAgdmp1c3QgPSAtMC4yKQpgYGAKCmBgYHtyIEYxLWhhdGNoaW5nLXN1Y2Nlc3MtZWZmLXBsb3RzLCBmaWcuaGVpZ2h0PTExLCBmaWcud2lkdGg9OH0KZ2dhcnJhbmdlKEp1bmVfaHNfc2hvcnRfcGxvdCwgSnVuZV9oc19sb25nX3Bsb3QsIAogICAgICAgICAgQXVndXN0X2hzX3Nob3J0X3Bsb3QsIEF1Z3VzdF9oc19sb25nX3Bsb3QsCiAgICAgICAgICBOb3ZlbWJlcl9oc19zaG9ydF9wbG90LCBOb3ZlbWJlcl9oc19sb25nX3Bsb3QsCiAgICAgICAgICBuY29sID0gMiwgbnJvdyA9IDMsCiAgICAgICAgICBsYWJlbHMgPSAiQVVUTyIsCiAgICAgICAgICB2anVzdCA9IC0wLjIpCmBgYAoKYGBge3IgRjEtcHJvZHVjdGlvbi1lZmYtcGxvdHMsIGZpZy5oZWlnaHQ9MTEsIGZpZy53aWR0aD04fQpnZ2FycmFuZ2UoSnVuZV9yZl9zaG9ydF9wbG90LCBKdW5lX3JmX2xvbmdfcGxvdCwgCiAgICAgICAgICBBdWd1c3RfcmZfc2hvcnRfcGxvdCwgQXVndXN0X3JmX2xvbmdfcGxvdCwKICAgICAgICAgIE5vdmVtYmVyX3JmX3Nob3J0X3Bsb3QsIE5vdmVtYmVyX3JmX2xvbmdfcGxvdCwKICAgICAgICAgIG5jb2wgPSAyLCBucm93ID0gMywKICAgICAgICAgIGxhYmVscyA9ICJBVVRPIiwKICAgICAgICAgIHZqdXN0ID0gLTAuMikKYGBgCgpgYGB7ciBTdXBwLUZpZy00LUYxLWJvZHktc2l6ZS12cy10ZW1wZXJhdHVyZX0Kc2Vhc29uYWxfY29scyA9IGMoIkp1bmUiID0gIiNFNjlGMDAiLCAiQXVndXN0IiA9ICIjRDU1RTAwIiwgIk5vdmVtYmVyIiA9ICIjMDA3MkIyIikKRjFfZmJzJElEID0gcGFzdGUoRjFfZmJzJE1vbnRoLCBGMV9mYnMkUGFyZW50YWxfdHJlYXRtZW50LCBGMV9mYnMkRGF5LCBzZXAgPSAiXyIpCmdncGxvdChGMV9mYnMsIGFlcyh4ID0gT2Zmc3ByaW5nX3RlbXAsIHkgPSBTaXplLCBjb2xvdXIgPSBNb250aCwgZ3JvdXAgPSBJRCwgbGluZXR5cGUgPSBQYXJlbnRhbF90cmVhdG1lbnQpKSArIAogIGdlb21faml0dGVyKHdpZHRoID0gMC41LCBzaXplID0gMS42LCBhbHBoYSA9IDAuNCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNpemUgPSAxLjQsIGFscGhhID0gMC4yKSArIAogIHRoZW1lX3B1YnIoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoMTIsMTcsMjIpKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gc2Vhc29uYWxfY29scykKYGBgCgoK